package com.lyf.jvm.learn.atsgg.memeorygc;

import org.junit.Test;

import java.lang.ref.Reference;
import java.util.Map;
import java.util.concurrent.TimeUnit;

/**
 * 一、四种引用概述
 * 强引用：不回收
 * 软引用
 * 弱引用
 * 虚引用
 * 前提：不存在引用关系了，
 *
 * @author LYF
 * @date 2022/7/13
 */
public class ReferenceTests {
    @Test
    public void test1() throws InterruptedException {
        //Reference
        String str = new String("hello");
        String str1 = str;// str1（局部-栈的指针） 指向 str所指向的地址--对象堆
        String str2 = str;

        str = null;//修改的是指针的指向，并非具体的地址中的内容，堆中的对象需要gc回收
        System.gc();
        System.out.println(str+"::"+str1+"::"+str2);

        /**
          virtual Stack     dump
         |   str1|
         |  str  |      [ "hello"]
         |______|     [_____]
         */

       // System.out.println(System.getenv());
        for (Map.Entry<String,String> map:System.getenv().entrySet()){
            System.out.println(map.getKey()+"::"+map.getValue());
        }

        long mem1 = Runtime.getRuntime().freeMemory();
        long mem2 = Runtime.getRuntime().totalMemory();//32532408
        System.out.println(mem1+"::"+mem2);
        String str3 = new String("hello2");
        mem1 = Runtime.getRuntime().freeMemory();
        str3 = null;
        System.gc();
        TimeUnit.SECONDS.sleep(1);
        System.out.println(mem1+"::"+mem2);//32364112 32531904
    }



}
